    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e5+5;
    const int inf=0x3f3f3f3f;
    int n,m,k;
    int dfs(int u,vector<vector<int> >& adj,unordered_map<int,unordered_set<int> >& mp,unordered_set<int>&st){
        int flag=0;
        int flag1=0;
        if(st.count(u)){
            return 0;
        }
        int minn1=0;
        int minn2=inf;
        for(int i=0;i<adj[u].size();i++){
            int temp=dfs(adj[u][i],adj,mp,st);
            if(temp==-1){
                flag1=1;
            }
            else {
                flag=1;
                minn1+=temp;
                if(mp[u].count(adj[u][i])){
                    minn2=min(minn2,temp+1);
                }
            }
        }
        if(flag==0){
            return -1;
        }
        if(flag&&flag1){
            if(minn2!=inf){
                return minn2;
            }
            else {
                return -1;
            }
        }
        else if(flag){
            return minn1;
        }
    }

    void solve(){
        cin>>n>>m>>k;
        unordered_map<int,unordered_set<int> >mp;
        unordered_set<int>st;
        vector<int>ru(N,0);
        vector<vector<int> >adj(N);
        queue<int>q;
        for(int i=1;i<=n;i++){
            int num;
            cin>>num;
            ru[i]=num;
            if(num==0){
                q.push(i);
            }
            for(int j=0;j<num;j++){
                int v;
                cin>>v;
                adj[i].push_back(v);
            }
        }
        for(int i=0;i<m;i++){
            int u,v;
            cin>>u>>v;
            mp[u].insert(v);
        }
        for(int i=0;i<k;i++){
            int u;
            cin>>u;
            st.insert(u);
        }
        int need=-1;
        need=dfs(1,adj,mp,st);
        cout<<need<<endl;
        return;
    }

    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0),cout.tie(0);
        int _;
        cin>>_;
        while(_--){
            solve();
        }
        return 0;
    }